from flask import Blueprint, request, jsonify

from constants import questions, start,askforgptText,options,end
from getUserInput import extract_value
from gpt import ChatBot
import torch

from inputAndOutput import predict_mental_health

chat_bp = Blueprint('chat', __name__)
chatbot = ChatBot()
# cnt变量表示当前的问题的序号
# 心里预测接口
@chat_bp.route('/chat', methods=['POST'])
def chat():
    try:
        print("/chat接口调用")
        print(chatbot.cnt)
        user_input = request.form['user_input']
        # 正常进来

        if chatbot.flag!=0:
            if user_input == "exit":
                chatbot.chat_history = []
                chatbot.chat_history2 = []
                chatbot.flag = 0
                chatbot.cnt = 0
                return "当然可以，心理测试是一种评估个人心理状态、性格特征、情绪倾向等的工具。不过，请注意，我提供的心理测试仅供参考，不能替代专业心理咨询师或医生的诊断。如果你准备好了，我们可以重新开始一个简单的心理测试，耗时15分钟左右，如果您准备好了请告诉我"
            user_input="用户的输入是:"+user_input+"。"+askforgptText+options[chatbot.cnt]
            chatbot2=ChatBot()
            response = chatbot2.interact_with_openai(user_input,1)
            print(user_input)
            print(response)
            # 把返回结果经过extract_value匹配后加入到userChoice中
            chatbot.userChoice.append(extract_value(response))
            print(chatbot.userChoice)
        else:
            chatbot.flag = 1
        #     问完所有问题了，应该预测结果了


        if chatbot.cnt==43:
            # chatbot.userChoice[:43] = ["1"] * 43+["上海"]#此处假数据用于测试
            numeric_values = [int(item) for item in chatbot.userChoice if item.isdigit()]
            print(len(numeric_values))
            while len(numeric_values) < 43:
                numeric_values.append(1)
            while len(numeric_values) > 43:
                numeric_values.pop()
            del numeric_values[-8]
            # 这里因为teach_flag数据还没有传过来，先给它一个假的值
            numeric_values[-2] = 1
            # Convert the numeric values to PyTorch tensor
            tensor_data = torch.tensor([numeric_values], dtype=torch.float32)
            # 将 tensor_data 重新形状为所需形式（一维张量）
            tensor_data = tensor_data.view(-1)
            sample_data = torch.tensor(tensor_data, dtype=torch.float32).unsqueeze(0)  # 添加 batch 维度
            # 进行预测
            result = predict_mental_health(sample_data)
            if(result):
                return "您可能存在心理健康问题,希望能引起你的重视,谢谢"
            else:
                return "您应该不存在心理健康问题,请不用过分担心,谢谢"
        user_input = start + questions[chatbot.cnt]+end
        print(user_input)
        tmp=chatbot.interact_with_openai(user_input,1)
        print(tmp)
        chatbot.cnt += 1
        return tmp
    except Exception as e:
        print(str(e))
        return jsonify({'error': str(e)})
# gpt聊天接口
@chat_bp.route('/gpt', methods=['POST'])
def gpt():
        print("gpt call")
        user_input = request.form['user_input']
        chatbot2 = ChatBot()
        response = chatbot2.interact_with_openai(user_input, 2)
        return response


